home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / tools / sharp / sxwork3.lzh / サンプル応用編 / 簡易エディタ / SEESE.C < prev    next >
Text File  |  1994-03-10  |  17KB  |  542 lines

  1. /******************************************************************************
  2.  *    seese.c:    ファイル名入力用疑似ダイアログ関数モジュール
  3.  ******************************************************************************
  4.  *    Workroom SX-68K Sample Program Copyright 1994 SHARP
  5.  */
  6. #include <ctype.h>
  7. #include <string.h>
  8. #include <stdlib.h>
  9. #include <sxmemory.h>        /* メモリマンを利用するときに必要    */
  10. #include <event.h>        /* イベントマンを利用するときに必要    */
  11. #include <sxgraph.h>        /* グラフマンを利用するときに必要    */
  12. #include <control.h>        /* コントロールマンを利用するときに必要    */
  13. #include <dialog.h>        /* ダイアログマンを利用するときに必要    */
  14. #include <text.h>        /* テキストマンを利用するときに必要    */
  15. #include <task.h>        /* タスクマンを利用するときに必要    */
  16. #include "sedit.h"        /* このプログラム固有のヘッダファイル    */
  17.  
  18. /******************************************************************************
  19.  *    openEseDlg():    疑似ダイアログのオープン
  20.  ******************************************************************************
  21.  *    引数:    EseDlg *pese    疑似ダイアログレコードへのポインタ
  22.  *        Window *winPtr    ウィンドウポインタ
  23.  *        char *title    ダイアログタイトルへのポインタ
  24.  *    戻り値:    BOOLEAN        = TRUE:  作成成功
  25.  *                = FALSE: 作成失敗
  26.  *    注釈:
  27.  *    疑似ダイアログのワークを初期化する。
  28.  *    疑似ダイアログの表示はshowEseDlg()で行う。
  29.  */
  30. BOOLEAN openEseDlg(EseDlg *pese, Window *winPtr, char *title)
  31. {
  32.     /* 疑似ダイアログの各種座標 */
  33.     static Rect rcFrame = {        /* 外枠                */
  34.         ESE_X + 0, ESE_Y + 0, ESE_X + 321, ESE_Y + 104
  35.     };
  36.     static Rect rcText = {        /* テキスト入力欄        */
  37.         ESE_X + 13, ESE_Y + 30, ESE_X + 305, ESE_Y + 58
  38.     };
  39.     static Rect rcPart = {        /* 文字ボタンのパーティション    */
  40.         ESE_X + 218, ESE_Y + 67, ESE_X + 301, ESE_Y + 97
  41.     };
  42.     /* ダイアログタイトルの表示位置 */
  43.     static Point ttlPos = { ESE_X + 15, ESE_Y + 15 };
  44.  
  45.     pese->windowPtr = winPtr;
  46.     pese->rcFrame = rcFrame;    /* 外枠レクタングルの登録    */
  47.     pese->rcText = rcText;        /* テキストエディット用のレクタングル */
  48.     pese->rcDest = rcText;
  49.  
  50.     pese->rcPart = rcPart;        /* 文字ボタンを囲むレクタングル    */
  51.     pese->ttlPos = ttlPos;        /* タイトル表示座標        */
  52.     pese->visible = 0;
  53.  
  54.     pese->title = MMChHdlNew(256);    /* タイトル文字列用ハンドルを確保する */
  55.     if (pese->title == NULL)
  56.         return FALSE;
  57.  
  58.     strcpy(*pese->title, title);    /* タイトルを設定する        */
  59.     if (!createEseText(pese))    /* テキストエディットを作成する    */
  60.         return FALSE;
  61.  
  62.     if (!createEseControl(pese))    /* コントロールを作成する    */
  63.         return FALSE;
  64.  
  65.     return TRUE;
  66. }
  67.  
  68. /******************************************************************************
  69.  *    closeEseDlg():    疑似ダイアログのクローズ
  70.  ******************************************************************************
  71.  *    引数:    EseDlg *pese    疑似ダイアログレコードへのポインタ
  72.  *    注釈:
  73.  *    疑似ダイアログを消去し、確保しているコントロールハンドルなど、すべて廃
  74.  *    棄します。
  75.  */
  76. void closeEseDlg(EseDlg *pese)
  77. {
  78.     int lastFC, lastAP;
  79.  
  80.     if (pese->visible) {
  81.         GMSetGraph(&pese->windowPtr->graph);
  82.  
  83.         /* アクセスページを0と1ページにする */
  84.         lastAP = GMAPage(G_PAGE0 | G_PAGE1);
  85.         lastFC = GMForeColor(G_LGRAY);
  86.         releaseClip(pese->windowPtr);
  87.         GMFillRect(&pese->rcFrame);
  88.         addUpdate(pese->windowPtr, &pese->rcFrame);
  89.         GMAPage(lastAP);
  90.         GMForeColor(lastFC);
  91.     }
  92.     if (pese->tEditHdl != NULL) {
  93.         /* テキストエディットハンドルを廃棄する */
  94.         TMDispose(pese->tEditHdl);
  95.         pese->tEditHdl = NULL;
  96.     }
  97.     if (pese->execBtnHdl != NULL) {
  98.         CMDispose(pese->execBtnHdl);
  99.         pese->execBtnHdl = NULL;
  100.     }
  101.     if (pese->canBtnHdl != NULL) {
  102.         CMDispose(pese->canBtnHdl);
  103.         pese->canBtnHdl = NULL;
  104.     }
  105.     MMHdlDispose(pese->title);    /* ハンドルを解放する        */
  106.     pese->title = NULL;
  107. }
  108.  
  109. /******************************************************************************
  110.  *    drawEseDlg():    疑似ダイアログの描画
  111.  ******************************************************************************
  112.  *    引数:    EseDlg *pese    疑似ダイアログレコードへのポインタ
  113.  */
  114. void drawEseDlg(EseDlg *pese)
  115. {
  116.     int lastAP, lastFC, lastBC, lastFK;
  117.  
  118.     if (!pese->visible)        /* 表示されていないか?        */
  119.         return;
  120.  
  121.     GMSetGraph(&pese->windowPtr->graph);
  122.  
  123.     releaseClip(pese->windowPtr);
  124.     /* アクセスページを0と1ページにする */
  125.     lastAP = GMAPage(G_PAGE0 | G_PAGE1);
  126.     lastFC = GMForeColor(G_BLACK);
  127.     lastBC = GMBackColor(G_LGRAY);
  128.     lastFK = GMFontKind(G_ROM12);
  129.  
  130.     GMScrewRect(&pese->rcFrame);    /* ネジ付レクタングルを表示する    */
  131.     GMShadowRect(&pese->rcPart);
  132.     CMDrawOne(pese->execBtnHdl);    /* ボタンを描画する        */
  133.     CMDrawOne(pese->canBtnHdl);
  134.     MMHdlLock(pese->title);
  135.     GMShadowStrZ(*pese->title, pese->ttlPos.x_y); /* ボタンを描画する */
  136.     MMHdlUnlock(pese->title);
  137.  
  138.     GMBackColor(G_WHITE);
  139.     GMShadowRect(&pese->rcText);
  140.     /* テキストエディットの文字列を描画する */
  141.     TMUpDate(pese->tEditHdl, &pese->rcText);
  142.  
  143.     GMAPage(lastAP);
  144.     GMForeColor(lastFC);
  145.     GMBackColor(lastBC);
  146.     GMFontKind(lastFK);
  147.  
  148.     setClip(pese->windowPtr, &pese->rcFrame);
  149. }
  150.  
  151. /******************************************************************************
  152.  *    showEseDlg():    疑似ダイアログの表示
  153.  ******************************************************************************
  154.  *    引数:    EseDlg *pese    疑似ダイアログレコードへのポインタ
  155.  */
  156. void showEseDlg(EseDlg *pese)
  157. {
  158.     int lastFC, lastAP;
  159.  
  160.     if (pese->visible)
  161.         return;
  162.  
  163.     GMSetGraph(&pese->windowPtr->graph);
  164.  
  165.     releaseClip(pese->windowPtr);
  166.     /* アクセスページを0と1ページにする */
  167.     lastAP = GMAPage(G_PAGE0 | G_PAGE1);
  168.     lastFC = GMForeColor(G_LGRAY);
  169.  
  170.     GMPenHide();
  171.     CMShow(pese->execBtnHdl);
  172.     CMShow(pese->canBtnHdl);
  173.     GMPenShow();
  174.     TMShow(pese->tEditHdl);
  175.     pese->visible = TRUE;
  176.  
  177.     GMAPage(lastAP);
  178.     GMForeColor(lastFC);
  179.  
  180.     addUpdate(pese->windowPtr, &pese->rcFrame);
  181.     setClip(pese->windowPtr, &pese->rcFrame);
  182. }
  183.  
  184. /******************************************************************************
  185.  *    hideEseDlg():    疑似ダイアログの消去
  186.  ******************************************************************************
  187.  *    引数:    EseDlg *pese    疑似ダイアログレコードへのポインタ
  188.  */
  189. void hideEseDlg(EseDlg *pese)
  190. {
  191.     int lastFC, lastAP;
  192.  
  193.     if (!pese->visible)        /* 表示されていないか?        */
  194.         return;
  195.  
  196.     GMSetGraph(&pese->windowPtr->graph);
  197.  
  198.     /* アクセスページを0と1ページにする */
  199.     lastAP = GMAPage(G_PAGE0 | G_PAGE1);
  200.     lastFC = GMForeColor(G_LGRAY);
  201.  
  202.     releaseClip(pese->windowPtr);
  203.     pese->visible = FALSE;
  204.     CMHide(pese->execBtnHdl);
  205.     CMHide(pese->canBtnHdl);
  206.     TMHide(pese->tEditHdl);
  207.     GMFillRect(&pese->rcFrame);
  208.     addUpdate(pese->windowPtr, &pese->rcFrame);
  209.  
  210.     GMAPage(lastAP);
  211.     GMForeColor(lastFC);
  212. }
  213.  
  214. /******************************************************************************
  215.  *    createEseText():    疑似ダイアログ用テキストエディットの作成
  216.  ******************************************************************************
  217.  *    引数:    EseDlg *pese    疑似ダイアログレコードへのポインタ
  218.  *    戻り値:    BOOLEAN        = TRUE:  作成成功
  219.  *                = FALSE: 作成失敗
  220.  */
  221. BOOLEAN createEseText(EseDlg *pese)
  222. {
  223.     int errCode;
  224.  
  225.     /* テキストエディット用ディスティネーションレクタングルを作成する */
  226.     pese->rcDest.d.left++;
  227.     pese->rcDest.d.top++;
  228.     pese->rcDest.d.right -= 2;
  229.     pese->rcDest.d.bottom -= 2;
  230.  
  231.     errCode = TMNew2(&pese->rcDest, &pese->rcDest, &pese->windowPtr->graph, &pese->tEditHdl);
  232.     if (errCode < 0)
  233.         /* テキストエディットが作成できなかった */
  234.         return FALSE;
  235.  
  236.     (*pese->tEditHdl)->lenMax = TS_NAMEMAX; /* 入力最大文字数を設定する */
  237.     (*pese->tEditHdl)->lineHeight = T_LHEIGHT; /* 改行幅を設定する    */
  238.     (*pese->tEditHdl)->editMode = 0; /* 編集モードを通常表示にする    */
  239.     /* ファンクションキーアサインテーブルを設定する */
  240.     (*pese->tEditHdl)->funcCode = funcKeyTbl;
  241.  
  242.     return TRUE;
  243. }
  244.  
  245. /******************************************************************************
  246.  *    createEseControl():    疑似ダイアログ上のコントロールの作成
  247.  ******************************************************************************
  248.  *    引数:    EseDlg *pese    疑似ダイアログレコードへのポインタ
  249.  *    戻り値:    BOOLEAN        = TRUE:  作成成功
  250.  *                = FALSE: 作成失敗
  251.  */
  252. BOOLEAN createEseControl(EseDlg *pese)
  253. {
  254.     static Rect rcExecBtn  = {    /* [実行]ボタン            */
  255.         ESE_X + 224, ESE_Y + 73, ESE_X + 224 + CHRBTN_H + 12 * 2, ESE_Y + 73 + CHRBTN_V
  256.     };
  257.     static Rect rcCanBtn = {    /* [取消]ボタン            */
  258.         ESE_X + 266, ESE_Y + 73, ESE_X + 266 + CHRBTN_H + 12 * 2, ESE_Y + 73 + CHRBTN_V
  259.     };
  260.  
  261.     pese->execBtnHdl = CMOpen(pese->windowPtr, &rcExecBtn,
  262.         (_LASCII)"\x04実行", FALSE, 0, 0, 1, CI_CHRBTN << 4, 0);
  263.     if (pese->execBtnHdl == NULL)
  264.         return FALSE;
  265.  
  266.     pese->canBtnHdl = CMOpen(pese->windowPtr, &rcCanBtn,
  267.         (_LASCII)"\x04取消", FALSE, 0, 0, 1, CI_CHRBTN << 4, 0);
  268.     if (pese->canBtnHdl == NULL)
  269.         return FALSE;
  270.  
  271.     return TRUE;
  272. }
  273.  
  274. /******************************************************************************
  275.  *    caretEseDlg():    疑似ダイアログのカーソル制御
  276.  ******************************************************************************
  277.  *    引数:    EseDlg *pese    疑似ダイアログレコードへのポインタ
  278.  *        BOOLEAN sw    = TRUE:  表示
  279.  *                = FALSE: 消去
  280.  */
  281. void caretEseDlg(EseDlg *pese, BOOLEAN sw)
  282. {
  283.     int lastAP, lastFC, lastBC, lastFK;
  284.  
  285.     if (!pese->visible)        /* 表示されていないか?        */
  286.         return;
  287.  
  288.     GMSetGraph(&pese->windowPtr->graph);
  289.  
  290.     releaseClip(pese->windowPtr);    /* クリッピングを解除する    */
  291.     /* アクセスページを0と1ページにする */
  292.     lastAP = GMAPage(G_PAGE0 | G_PAGE1);
  293.     lastFC = GMForeColor(G_BLACK);
  294.     lastBC = GMBackColor(G_WHITE);
  295.     lastFK = GMFontKind(G_ROM12);
  296.  
  297.     TMCaret(pese->tEditHdl, sw);    /* カーソルをオン/オフする    */
  298.  
  299.     GMAPage(lastAP);
  300.     GMForeColor(lastFC);
  301.     GMBackColor(lastBC);
  302.     GMFontKind(lastFK);
  303.     setClip(pese->windowPtr, &pese->rcFrame); /* クリッピングを戻す    */
  304. }
  305.  
  306. /******************************************************************************
  307.  *    eseDlgEvent():    イベントに応じた処理
  308.  ******************************************************************************
  309.  *    引数:    EseDlg *pese    疑似ダイアログレコードへのポインタ
  310.  *        TsEvent *ptsev    タスクマンイベントレコードへのポインタ
  311.  *    戻り値:    int num        = 1: [実行]ボタン
  312.  *                = 2: [取消]ボタン
  313.  */
  314. int eseDlgEvent(EseDlg *pese, TsEvent *ptsev)
  315. {
  316.     int lastAP, lastFC, lastBC, lastFK;
  317.     int keyCode;            /* キーコード            */
  318.     int shortCut;            /* ショートカットキー        */
  319.     int num = 0;
  320.     int partCode;            /* コントロールのパートコード    */
  321.     LPoint lpt;
  322.     Control **ctrlHdl;        /* コントロールハンドル        */
  323.  
  324.     if (!pese->visible)        /* 表示されていないか?        */
  325.         return 0;
  326.  
  327.     GMSetGraph(&pese->windowPtr->graph);
  328.  
  329.     releaseClip(pese->windowPtr);
  330.     /* アクセスページを0と1ページにする */
  331.     lastAP = GMAPage(G_PAGE0 | G_PAGE1);
  332.     lastFC = GMForeColor(G_BLACK);
  333.     lastBC = GMBackColor(G_WHITE);
  334.     lastFK = GMFontKind(G_ROM12);
  335.  
  336.     switch (ptsev->ts.what) {
  337.     case E_IDLE:            /* アイドルイベント        */
  338.         TMEventW(pese->tEditHdl, ptsev); /* カーソルを点滅させる */
  339.         break;
  340.     case E_KEYDOWN:            /* キーダウンイベント        */
  341.         /* ファンクションアサインテーブルによりキーコードを変換する */
  342.         keyCode = TMKeyToAsk(pese->tEditHdl, ptsev);
  343.         if (keyCode == -2) {    /* テーブルに登録されてないか?    */
  344.             /* OPT.1キーが押されたか? */
  345.             if (ptsev->ev.how & KS_OPT1) {
  346.                 /* キー入力した文字を大文字に変換する */
  347.                 shortCut = toupper((int) ptsev->ev.whom.key.ascii);
  348.                 switch (shortCut) {
  349.                 case 'Q': /* 終了            */
  350.                     num = 2; /* [取消]ボタン    */
  351.                     break;
  352.                 default:
  353.                     /* テキストマンのショートカットに
  354.                        対応する */
  355.                     TMEventW(pese->tEditHdl, ptsev);
  356.                     break;
  357.                 }
  358.             } else {
  359.                 switch (ptsev->ev.whom.key.ascii) {
  360.                 case '\r':    /* リターンキーかENTERキー */
  361.                     num = 1; /* [実行]ボタン    */
  362.                     break;
  363.                 case '\x1b':    /* ESCキー        */
  364.                     num = 2; /* [取消]ボタン    */
  365.                     break;
  366.                 default:    /* その他のキー        */
  367.                     TMEventW(pese->tEditHdl, ptsev);
  368.                     break;
  369.                 }
  370.             }
  371.         } else
  372.             /* その他のキーの場合 */
  373.             TMEventW(pese->tEditHdl, ptsev);
  374.         break;
  375.     case E_MSLDOWN:            /* マウスレフトダウンイベント    */
  376.         /* ダイアログより外の座標は、チェックしない */
  377.         lpt = GMGlobalToLocal(ptsev->ev.where.x_y);
  378.         if (GMPtInRect(&pese->rcFrame, lpt)) {
  379.             partCode = CMFind(lpt, pese->windowPtr, &ctrlHdl);
  380.             if (ctrlHdl == pese->execBtnHdl) {
  381.                 if (CMCheck(ctrlHdl, lpt, NULL) == C_INBTTN)
  382.                     num = 1; /* [実行]ボタン    */
  383.             } else if (ctrlHdl == pese->canBtnHdl) {
  384.                 if (CMCheck(ctrlHdl, lpt, NULL) == C_INBTTN)
  385.                     num = 2; /* [取消]ボタン    */
  386.             } else
  387.                 TMEventW(pese->tEditHdl, ptsev);
  388.         }
  389.         break;
  390.     case E_MSRDOWN:            /* マウスライトダウンイベント    */
  391.         TMEventW(pese->tEditHdl, ptsev);
  392.         break;
  393.     }
  394.     GMAPage(lastAP);
  395.     GMForeColor(lastFC);
  396.     GMBackColor(lastBC);
  397.     GMFontKind(lastFK);
  398.     setClip(pese->windowPtr, &pese->rcFrame);
  399.  
  400.     return num;
  401. }
  402.  
  403. /******************************************************************************
  404.  *    dropEseIcon():    アイコンのドロップ処理
  405.  ******************************************************************************
  406.  *    引数:    EseDlg *pese    疑似ダイアログレコードへのポインタ
  407.  *        TsEvent *ptsev    タスクマンイベントレコードへのポインタ
  408.  *    戻り値:    BOOLEAN        = TRUE:  ドロップ成功
  409.  *                = FALSE: ドロップデータの取得に失敗
  410.  */
  411. BOOLEAN dropEseIcon(EseDlg *pese, TsEvent *ptsev)
  412. {
  413.     int errCode, len;
  414.     int lastAP, lastFC, lastBC, lastFK;
  415.     BOOLEAN ret = FALSE;        /* 呼び出し関数リターン値格納用    */
  416.     Drag *dragPtr;            /* ドラッグポインタ        */
  417.     Cell *pcell;            /* セルレコードへのポインタ    */
  418.     char fileName[TS_NAMEMAX];    /* ファイル名            */
  419.  
  420.     errCode = TSGetDrag(&dragPtr);    /* ドラッグポインタを取得する    */
  421.     if (errCode < 0)
  422.         /* ドラッグレコードが無い */
  423.         return FALSE;
  424.  
  425.     MMHdlLock(dragPtr->cellList);    /* セルリストへのハンドルをロックする */
  426.     pcell = *dragPtr->cellList;    /* セルレコードへのポインタを取得する */
  427.     TSHideDrag();            /* ラバーバンドを消去する    */
  428.     /* セルレコードの情報の種類がアイコン管理レコード(上位ワードが'FS')
  429.        か? */
  430.     if (HIWORD(pcell->kind) == 'FS') {
  431.         /* アイコンは1つ(ドラッグレコードのセルリストの長さがアイコン
  432.            管理レコードを含むセルレコードの長さと同一の場合)か? */
  433.         if (dragPtr->size == sizeof(IcState) + 8 ) {
  434.             /* アイコンのフルパスを取得する */
  435.             len = TSISRecToStr((IcState *) pcell->data, fileName);
  436.             if (len >= 0) {
  437.                 GMSetGraph(&pese->windowPtr->graph);
  438.  
  439.                 releaseClip(pese->windowPtr);
  440.                 /* アクセスページを0と1ページにする */
  441.                 lastAP = GMAPage(G_PAGE0 | G_PAGE1);
  442.                 lastFC = GMForeColor(G_BLACK);
  443.                 lastBC = GMBackColor(G_WHITE);
  444.                 lastFK = GMFontKind(G_ROM12);
  445.  
  446.                 /* テキストエディットに挿入する */
  447.                 TMInsert(pese->tEditHdl, fileName, len);
  448.  
  449.                 GMAPage(lastAP);
  450.                 GMForeColor(lastFC);
  451.                 GMBackColor(lastBC);
  452.                 GMFontKind(lastFK);
  453.                 TSEndDrag(TS_FINISH); /* ドラッグを終了する */
  454.                 ret = TRUE;
  455.                 setClip(pese->windowPtr, &pese->rcFrame);
  456.             } else {
  457.                 /* アイコンを元の位置にはじき飛ばして終了する */
  458.                 TSEndDrag(TS_PUTBACK);
  459.                 ret = FALSE;
  460.             }
  461.         } else {
  462.             /* アイコンが2つ以上か他のドラッグレコードだったら
  463.                アイコンを元の位置にはじき飛ばして終了する */
  464.             TSEndDrag(TS_PUTBACK);
  465.             ret = FALSE;
  466.         }
  467.     }
  468.  
  469.     /* セルリストへのハンドルのロックを解除する */
  470.     MMHdlUnlock(dragPtr->cellList);
  471.     return ret;
  472. }
  473.  
  474. /******************************************************************************
  475.  *    getEseStr():    文字列の取得
  476.  ******************************************************************************
  477.  *    引数:    EseDlg *pese    疑似ダイアログレコードへのポインタ
  478.  *        char *ptext    格納バッファへのポインタ
  479.  *    戻り値:    int len        <  0: エラーコード
  480.  *                >= 0: 文字列の長さ
  481.  */
  482. int getEseStr(EseDlg *pese, char *ptext)
  483. {
  484.     int len;
  485.  
  486.     len = TMGetText(pese->tEditHdl, ptext, TS_NAMEMAX);
  487.     ptext[len] = 0;
  488.  
  489.     return len;
  490. }
  491.  
  492. /******************************************************************************
  493.  *    setEseStr():    文字列の設定
  494.  ******************************************************************************
  495.  *    引数:    EseDlg *pese    疑似ダイアログレコードへのポインタ
  496.  *        char *ptext    格納バッファへのポインタ
  497.  *        int length    文字列の長さ
  498.  *    戻り値:    int errCode    < 0: エラーコード
  499.  */
  500. int setEseStr(EseDlg *pese, char *ptext, int length)
  501. {
  502.     int errCode;
  503.  
  504.     errCode = TMSetText(pese->tEditHdl, ptext, length);
  505.     if (pese->visible)
  506.         /* 表示されていればアップデートする */
  507.         addUpdate(pese->windowPtr, &pese->rcDest);
  508.  
  509.     return errCode;
  510. }
  511.  
  512. /******************************************************************************
  513.  *    setClip():    クリッピングの設定
  514.  ******************************************************************************
  515.  *    引数:    Window *winPtr    ウィンドウポインタ
  516.  *        Rect *prc    レクタングルへのポインタ
  517.  */
  518. void setClip(Window *winPtr, Rect *prc)
  519. {
  520.     Region **rgnHdl;
  521.  
  522.     rgnHdl = GMNewRgn();
  523.     if (rgnHdl == NULL) {
  524.         TSErrDialogN(D_CONFIRM, "メモリが確保できません。");
  525.         return;
  526.     }
  527.     GMRectRgn(rgnHdl, &winPtr->graph.rect);
  528.     GMDiffRectRgn(rgnHdl, rgnHdl, prc);
  529.     GMSetClip(rgnHdl);
  530.     GMDisposeRgn(rgnHdl);        /* リージョンハンドルを解放する    */
  531. }
  532.  
  533. /******************************************************************************
  534.  *    releaseClip():    クリッピングの解除
  535.  ******************************************************************************
  536.  *    引数:    Window *winPtr    ウィンドウポインタ
  537.  */
  538. void releaseClip(Window *winPtr)
  539. {
  540.     GMClipRect(&winPtr->graph.rect);
  541. }
  542.